home *** CD-ROM | disk | FTP | other *** search
/ Aminet 43 / Aminet 43 (2001)(GTI - Schatztruhe)[!][Jun 2001].iso / Aminet / comm / tcp / daytimedemo.lha / daytimedemo / daytime.c < prev    next >
C/C++ Source or Header  |  2001-04-08  |  3KB  |  147 lines

  1. /*
  2.  * daytime.c
  3.  *
  4.  * client for tcp daytime service
  5.  *
  6.  * adapted from "UNIX Network Programming, Vol.1, 2nd Edition" by W. Richard Stevens
  7.  * for Amiga® OS with AmiTCP 4.x compatible network stacks
  8.  *
  9.  * should work with any compiler; link additional startup routine "startup.c" for Maxon C/C++ only
  10.  */
  11.  
  12. #include <pragma/exec_lib.h>
  13. #include <pragma/dos_lib.h>
  14. #include <pragma/socket_lib.h>
  15. #include <sys/socket.h>
  16. #include <string.h>
  17.  
  18.  
  19. #define DAYTIMEPORT    13
  20. #define LOCALHOSTIP    "127.0.0.1"
  21.  
  22.  
  23. struct Library *SocketBase = NULL;
  24.  
  25.  
  26. /* let's design our resource handling "re-usable" */
  27. struct Library *openSockLib(void)
  28. {
  29.     return(OpenLibrary(SOCKETNAME, 4U));
  30. }
  31.  
  32. void closeSockLib(struct Library **base)
  33. {
  34.     CloseLibrary(*base);
  35.     *base = NULL;
  36. }
  37.  
  38.  
  39. LONG main(LONG argc, APTR argv)
  40. {
  41.     struct RDArgs *rdargs;
  42.     STRPTR tmpl = "H=HOSTIP/K,P=PORT/K/N";
  43.     LONG arg[2] = {0L, 0L};
  44.     LONG rw = RETURN_OK;
  45.     char *hostip = LOCALHOSTIP;
  46.     int serviceport = DAYTIMEPORT;
  47.     
  48.     /* Workbench is not supported (this is a learning demo...) */
  49.     if(argc)
  50.     {
  51.         /* convenient Amiga shell-parameter handling */
  52.         rdargs = ReadArgs(tmpl, arg, NULL);
  53.         if(rdargs)
  54.         {
  55.             hostip = arg[0] ? (char *) arg[0] : hostip;
  56.             serviceport = arg[1] ? *((LONG *) arg[1]) : serviceport;
  57.         }
  58.         
  59.         /* open bsdsocket.library */
  60.         SocketBase = openSockLib();
  61.         if(SocketBase)
  62.         {
  63.             long sockfd;
  64.             
  65.             /* open TCP access */
  66.             sockfd = socket(AF_INET, SOCK_STREAM, 0L);
  67.             if(sockfd >= 0L)
  68.             {
  69.                 struct sockaddr_in servaddr;
  70.                 
  71.                 /* create TCP request */
  72.                 memset(&servaddr, 0L, sizeof(struct sockaddr_in));
  73.                 servaddr.sin_family            = AF_INET;
  74.                 servaddr.sin_port                = htons(serviceport);
  75.                 servaddr.sin_addr.s_addr    = inet_addr(hostip);    /* sin_addr == s_addr */
  76.                 if(servaddr.sin_addr.s_addr != (~0))
  77.                 {
  78.                     /* connect to service port on host [connect() has an internal CTRL_C handling] */
  79.                     if(connect(sockfd, (const struct sockaddr *) &servaddr, sizeof(struct sockaddr_in)) >= 0L)
  80.                     {
  81.                         char buffer[4];
  82.                         long rd;
  83.                         
  84.                         /* receive and print data (small buffer to force multiple recv()'s) */
  85.                         do
  86.                         {
  87.                             /* receive data */
  88.                             rd = recv(sockfd, buffer, 4, 0);
  89.                             if(rd)
  90.                             {
  91.                                 /* buffered write data */
  92.                                 FWrite(Output(), buffer, rd, 1);
  93.                                 
  94.                                 /* standard while()-loop emergency break */
  95.                                 if(CheckSignal(SIGBREAKF_CTRL_C))
  96.                                 {
  97.                                     PutStr("^C -- user break\n");
  98.                                     rw = RETURN_WARN;
  99.                                     break;
  100.                                 }
  101.                             }
  102.                         }
  103.                         while(rd > 0);
  104.                         
  105.                         /* empty buffers (not really required) */
  106.                         Flush(Output());
  107.                     }
  108.                     else
  109.                     {
  110.                         Printf("Could not connect to port %ld on \"%s\"\n", serviceport, hostip);
  111.                         rw = RETURN_ERROR;
  112.                     }
  113.                 }
  114.                 else
  115.                 {
  116.                     Printf("Not a valid network address: \"%s\"\n", hostip);
  117.                     rw = RETURN_ERROR;
  118.                 }
  119.                 
  120.                 /* release TCP access */
  121.                 CloseSocket(sockfd);
  122.             }
  123.             else
  124.             {
  125.                 Printf("Error code %ld while opening network socket\n", sockfd);
  126.                 rw = RETURN_FAIL;
  127.             }
  128.             
  129.             /* release bsdsocket.library */
  130.             closeSockLib(&SocketBase);
  131.         }
  132.         else
  133.         {
  134.             Printf(    "Error opening \"%s\" version %ld\n"
  135.                         "You must start AmiTCP 4.x, or a compatible TCP/IP stack\n",
  136.                          SOCKETNAME, 4L);
  137.             
  138.             rw = RETURN_FAIL;
  139.         }
  140.         
  141.         FreeArgs(rdargs);
  142.     }
  143.     
  144.     return(rw);
  145. }
  146.  
  147.